package com.jz.netthings.netty.protocol;

import com.jz.netthings.netty.protocol.bean.LoginRequestPacket;
import com.jz.netthings.netty.protocol.bean.LoginResponsePacket;
import com.jz.netthings.netty.serialize.Serializer;
import com.jz.netthings.netty.serialize.impl.JSONSerializer;
import com.jz.netthings.netty.support.Command;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.PooledByteBufAllocator;

import java.util.HashMap;
import java.util.Map;

/**
 * 数据包编解码
 */
@Deprecated
public class PacketCode {

//    private static final int MAGIC_NUMBER = 0x12345678;
//    public static final PacketCode INSTANCE = new PacketCode();
//
//    private final Map<Command, Class<? extends BasePacket>> packetTypeMap;
//    private final Map<Byte, Serializer> serializerMap;
//
//
//    private PacketCode() {
//        packetTypeMap = new HashMap<>();
//        packetTypeMap.put(Command.LOGIN_REQUEST, LoginRequestPacket.class);
//        packetTypeMap.put(Command.LOGIN_RESPONSE, LoginResponsePacket.class);
////        packetTypeMap.put(Command.FACE_DETECT_REQUEST, MessageRequestPacket.class);
////        packetTypeMap.put(Command.FACE_DETECT_RESPONSE, MessageResponsePacket.class);
//
//        serializerMap = new HashMap<>();
//        Serializer serializer = new JSONSerializer();
//        serializerMap.put(serializer.getSerializerAlgorithm(), serializer);
//    }
//
//    /**
//     * 编码
//     * @param byteBuf
//     * @param packet
//     */
//    public void encode(ByteBuf byteBuf, BasePacket packet) {
//        // 1. 序列化 java 对象
//        byte[] bytes = Serializer.DEFAULT.serialize(packet);
//
//        // 2. 实际编码过程
//        byteBuf.writeInt(MAGIC_NUMBER);
//        byteBuf.writeByte(packet.getVersion());
//        byteBuf.writeByte(Serializer.DEFAULT.getSerializerAlgorithm());
//        byteBuf.writeByte(packet.getCommand().getValue());
//        byteBuf.writeInt(bytes.length);
//        byteBuf.writeBytes(bytes);
//    }
//
//    /**
//     *  编码
//     * @param byteBufAllocator
//     * @param packet
//     * @return
//     */
//    public ByteBuf encode(ByteBufAllocator byteBufAllocator, BasePacket packet) {
//
//        // 1. 创建 ByteBuf 对象
//        ByteBuf byteBuf = byteBufAllocator.ioBuffer();
//        // 2. 序列化 java 对象
//        byte[] bytes = Serializer.DEFAULT.serialize(packet);
//
//        // 3. 实际编码过程
//        byteBuf.writeInt(MAGIC_NUMBER);
//        byteBuf.writeByte(packet.getVersion());
//        byteBuf.writeByte(Serializer.DEFAULT.getSerializerAlgorithm());
//        byteBuf.writeByte(packet.getCommand().getValue());
//        byteBuf.writeInt(bytes.length);
//        byteBuf.writeBytes(bytes);
//
//        return byteBuf;
//    }
//
//
//
//    /**
//     * 解码
//     * @param byteBuf
//     * @return
//     */
//    public BasePacket decode(ByteBuf byteBuf) {
//        // 跳过 magic number
//        byteBuf.skipBytes(4);
//
//        // 跳过版本号
//        byteBuf.skipBytes(1);
//
//        // 序列化算法
//        byte serializeAlgorithm = byteBuf.readByte();
//
//        // 指令
//        byte comm = byteBuf.readByte();
//        Command command = getCommand(comm);
//
//        // 数据包长度
//        int length = byteBuf.readInt();
//
//        byte[] bytes = new byte[length];
//        byteBuf.readBytes(bytes);
//
//        Class<? extends BasePacket> requestType = getRequestType(command);
//        Serializer serializer = getSerializer(serializeAlgorithm);
//
//        if (requestType != null && serializer != null) {
//            return serializer.deserialize(requestType, bytes);
//        }
//
//        return null;
//    }
//
//    private Command getCommand(byte command){
//        Command[] values = Command.values();
//
//        for(int i=0;values != null && i < values.length;i++){
//            Command value = values[i];
//
//            if (value.getValue() == new Integer(command).intValue()){
//                return value;
//            }
//        }
//        return null;
//    }
//
//    private Serializer getSerializer(byte serializeAlgorithm) {
//
//        return serializerMap.get(serializeAlgorithm);
//    }
//
//    private Class<? extends BasePacket> getRequestType(Command command) {
//
//        if (command == null){
//            return  null;
//        }
//        return packetTypeMap.get(command);
//    }


}
